home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / View.C < prev    next >
C/C++ Source or Header  |  1990-12-04  |  6KB  |  318 lines

  1. //$View$
  2.  
  3. #include "View.h"
  4. #include "Error.h"
  5. #include "Document.h"
  6. #include "Menu.h"
  7. #include "CmdNo.h"
  8. #include "ClipBoard.h"
  9. #include "PrintDialog.h"
  10. #include "Alert_e.h"
  11. #include "Clipper.h"
  12. #include "OrdColl.h"
  13. #include "String.h"
  14.  
  15. //---- View --------------------------------------------------------------------
  16.  
  17. AbstractMetaImpl(View, (TP(clippers), TP(nexthandler), TP(focus), 0));
  18.  
  19. View::View(EvtHandler *eh, Rectangle itsExtent, int id) : VObject(0, itsExtent, id)
  20. {
  21.     clippers= 0;
  22.     ResetFlag(eVObjOpen|eVObjHFixed|eVObjVFixed);
  23.     nexthandler= eh;
  24. }
  25.  
  26. View::~View()
  27. {
  28.     if (clippers) {
  29.     clippers->ForEach(Clipper,RemoveView)(this);
  30.     SafeDelete(clippers);
  31.     }
  32. }
  33.  
  34. Document *View::GetDocument()
  35. {
  36.     return (Document*) FindNextHandlerOfClass(Meta(Document));
  37. }
  38.  
  39. void View::CheckOpen()
  40. {
  41.     ResetFlag(eVObjOpen);
  42.     if (GetView() && GetView()->IsOpen()) {
  43.     SetFlag(eVObjOpen);
  44.     return;
  45.     }
  46.     if (clippers) {
  47.     Iter next(clippers);
  48.     VObject *fp;
  49.     
  50.     while (fp= (VObject*) next()) {
  51.         if (fp->IsOpen()) {
  52.         SetFlag(eVObjOpen);
  53.         return;
  54.         }
  55.     }
  56.     }
  57. }
  58.  
  59. void View::SetExtent(Point newExtent)
  60. {
  61.     Point oldExtent= contentRect.extent;
  62.     VObject::SetExtent(newExtent);
  63.     if (clippers) {
  64.     clippers->ForEach(Clipper,ViewSizeChanged)(oldExtent, newExtent);
  65.     }
  66. }
  67.  
  68. void View::AddToClipper(class Clipper *clipper)
  69. {
  70.     if (clippers == 0) {
  71.     clippers= new OrdCollection;
  72.     SetContainer(clipper);
  73.     }
  74.     clippers->RemovePtr(clipper);   // no duplicates
  75.     clippers->Add(clipper);
  76.     CheckOpen();
  77.     if (IsOpen())
  78.     Update();  // hack
  79. }
  80.  
  81. void View::RemoveFromClipper(Clipper* clipper)
  82. {
  83.     if (clippers) {
  84.     clippers->RemovePtr(clipper);
  85.     if (clippers->Size() <= 0) {
  86.         SetContainer(0);
  87.         SafeDelete(clippers);
  88.     }
  89.     }
  90.     CheckOpen();
  91. }
  92.  
  93. //---- drawing
  94.  
  95. void View::DrawAll(Rectangle r, bool)
  96. {
  97.     if (!gPrinting)
  98.     Update();
  99.     Draw(r);
  100.     if (!TestFlag(eViewNoPrint)) {
  101.     if (gPrintManager == 0)
  102.         gPrintManager= new PrintDialog;
  103.     gPrintManager->ShowPageGrid(r, this);
  104.     }
  105. }
  106.  
  107. void View::InvalidateRect(Rectangle r)
  108. {
  109.     if (clippers) {
  110.     clippers->ForEach(VObject,InvalidateViewRect)(r);
  111.     } else if (GetContainer())
  112.     GetContainer()->InvalidateRect(r);
  113. }
  114.  
  115. void View::ShowInAllClippers(VoidObjMemberFunc of, Object *op, void *v1, void *v2, void *v3, void *v4)
  116. {
  117.     if (clippers) { 
  118.     clippers->ForEach(Clipper,DrawInFocus)(of, op, v1, v2, v3, v4);
  119.     } else if (GetView()) {
  120.     GetView()->ShowInAllClippers(of, op, v1, v2, v3, v4);
  121.     }
  122. }
  123.  
  124. void View::Update()
  125. {
  126. }
  127.  
  128. Rectangle View::GetViewedRect()
  129. {
  130.     if (focus)
  131.     return focus->GetViewedRect();
  132.     if (GetView()) {
  133.     return GetView()->GetViewedRect();
  134.     }
  135.     return gRect0;
  136. }
  137.  
  138. //---- scrolling
  139.  
  140. void View::ConstrainScroll(Point*)
  141. {
  142. }
  143.  
  144. void View::RevealRect(Rectangle revealRect, Point minToSee)
  145. {
  146.     if (focus)
  147.     focus->RevealRect(revealRect, minToSee);
  148.     else if (clippers) {
  149.     clippers->ForEach(Clipper,RevealRect)(revealRect, minToSee);
  150.     } else if (GetView()) {
  151.     GetView()->RevealRect(revealRect, minToSee);
  152.     }
  153. }
  154.  
  155. void View::RevealAlign(Rectangle revealRect, VObjAlign al)
  156. {
  157.     if (focus)
  158.     focus->RevealAlign(revealRect, al);
  159.     else if (clippers) {
  160.     clippers->ForEach(Clipper,RevealAlign)(revealRect, al);
  161.     } else if (GetView()) {
  162.     GetView()->RevealAlign(revealRect, al);
  163.     }
  164. }
  165.  
  166. void View::Scroll(int mode, Point scroll, bool redraw)
  167. {
  168.     if (focus)
  169.     focus->Scroll(mode, scroll, redraw);
  170.     else if (clippers) {
  171.     clippers->ForEach(Clipper,Scroll)(mode, scroll, redraw);
  172.     } else if (GetView()) {
  173.     GetView()->Scroll(mode, scroll, redraw);
  174.     }
  175. }
  176.  
  177. //---- event handling
  178.  
  179. EvtHandler *View::GetNextHandler()
  180. {
  181.     return nexthandler;
  182. }
  183.  
  184. void View::SetNextHandler(EvtHandler *eh)
  185. {
  186.     nexthandler= eh;
  187. }
  188.  
  189. Command *View::Input(Point lp, Token t, Clipper *vf)
  190. {
  191.     focus= vf;
  192.     Command *cmd= DispatchEvents(lp, t, vf);
  193.     focus= 0;
  194.     return cmd;
  195. }
  196.  
  197. Command *View::DoCursorKeyCommand(EvtCursorDir d, Point p, Token t)
  198. {
  199.     if (focus)
  200.     focus->Scroll(cPartScrollStep, t.CursorPoint());
  201.     return VObject::DoCursorKeyCommand(d, p, t);
  202. }
  203.  
  204. Command *View::DoFunctionKeyCommand(int code, Point p, Token t)
  205. {
  206.     if (focus) {
  207.     switch (t.FunctionCode()) {
  208.     case 28:    // end
  209.         focus->Scroll(cPartScrollAbs, Point(0, 30000));
  210.         break;
  211.     case 22:    // home
  212.         focus->Scroll(cPartScrollAbs, gPoint0);
  213.         break;
  214.     case 24:    // page up
  215.         focus->Scroll(cPartScrollPage, Point(0, -1));
  216.         break;
  217.     case 30:    // page down
  218.         focus->Scroll(cPartScrollPage, Point(0, 1));
  219.         break;
  220.     }
  221.     }
  222.     return VObject::DoFunctionKeyCommand(code, p, t);
  223. }
  224.  
  225. //---- clipboard
  226.  
  227. bool View::CanPaste(char*)
  228. {
  229.     return FALSE;
  230. }
  231.  
  232. void View::SelectionToClipboard(char*, ostream&)
  233. {
  234. }
  235.  
  236. Command *View::PasteData(char*, istream&)
  237. {
  238.     return gNoChanges;
  239. }
  240.  
  241. bool View::HasSelection()
  242. {
  243.     return FALSE;
  244. }
  245.  
  246. //---- menus
  247.  
  248. Command *View::DoMenuCommand(int cmd)
  249. {
  250.     Command *cm;
  251.     
  252.     switch (cmd) {
  253.  
  254.     case cCOPY:
  255.     case cCUT:
  256.     gClipBoard->SelectionToClipboard(this);
  257.     return gNoChanges;
  258.  
  259.     case cPASTE:
  260.     cm= gClipBoard->PasteClipboard(this);
  261.     if (cm == gNoChanges)
  262.         ShowAlert(eAlertCaution, "Can't paste clipboard (%s)",
  263.                         gClipBoard->GetType());
  264.     return cm;
  265.  
  266.     case cPRINT:
  267.     Print();
  268.     return gNoChanges;
  269.  
  270.     default:
  271.     break;
  272.     }
  273.     return EvtHandler::DoMenuCommand(cmd);
  274. }
  275.  
  276. void View::DoSetupMenu(Menu *menu)
  277. {
  278.     EvtHandler::DoSetupMenu(menu);
  279.     menu->EnableItem(cPRINT);
  280.  
  281.     if (gClipBoard->CanPaste(this))
  282.     menu->EnableItem(cPASTE);
  283.     if (HasSelection())
  284.     menu->EnableItems(cCUT, cCOPY, 0);        
  285. }
  286.  
  287. void View::DoCreateMenu(Menu *m)
  288. {
  289.     VObject::DoCreateMenu(m);
  290.     Menu *fileMenu= m->FindMenuItem(cFILEMENU);
  291.     if (fileMenu) 
  292.     fileMenu->InsertItemsBefore(cSHOWAPPLWIN,
  293.         "print ...",        cPRINT,
  294.         "-",
  295.         0);
  296.         
  297.     if (!m->FindItem(cCUT)) 
  298.     m->AppendItems(
  299.         "cut",         cCUT,
  300.         "copy",        cCOPY,
  301.         "paste",       cPASTE,
  302.     0);
  303. }
  304.  
  305. //---- inspector
  306.  
  307. void View::InspectorId(char *buf, int sz)
  308. {
  309.     VObject *container= 0, *vop= this;
  310.     while (vop= vop->GetContainer())
  311.     container= vop;
  312.     if (container) {
  313.     container->InspectorId(buf, sz-6);
  314.     strn0cpy(buf, form("in %s", buf), sz);
  315.     } else
  316.     VObject::InspectorId(buf, sz);
  317. }
  318.